package com.atguigu.mybatis.mapper;

import com.atguigu.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.Map;

/**
 * Mybatis获取参数值的两种方式: #{} 和 ${}
 *  #{}的本质是占位符赋值,${}的本质是字符串拼接
 *  1.若mapper接口方法的参数为单个的字面量类型
 *    此时可以通过#{} 和 ${} 以任意的内容获取参数值,一定要注意${}的单引号问题
 *  2.若mapper接口方法的参数为多个的字面量类型
 *    此时Mybatis会将参数放在Map集合中,以两种方式存储数据
 *    a> 以arg0,arg1...为键,以参数为值
 *    b> 以param1,param2...为键,以参数为值
 *    因此只需要通过${}和#{}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题
 *  3.若mapper接口方法的参数为map集合类型的参数
 *    只需要通过${}和#{}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题
 *  4.若mapper接口方法的参数为实体类类型的参数 (记第4,5种方式就行！！！！重要重要重要！！！)
 *    只需要通过${}和#{}访问实体类中的属性名(属性名只跟get,set方法有关系,跟成员变量没关系,把set,get方法名中的set,get去掉,剩余部分的首字母小写,就是属性名),
 *    就可以获取相对应的值,一定要注意${}的单引号问题
 *  5.可以在mapper接口方法的参数上设置@Param注解 (记第4,5种方式就行！！！！重要重要重要！！！)
 *    此时Mybatis会将这些参数放在map中,以两种方式进行存储
 *    a> 以@Param注解的value属性值为键,以参数为值
 *    b> 以param1,param2...为键,以参数为值
 *    只需要通过${}和#{}访问map集合的键,就可以获取相对应的值,一定要注意${}的单引号问题
 */
public interface UserMapper {

    /**
     * 根据用户名查询用户信息(以单个的字面量类型作为参数)
     * @param username
     * @return
     */
    User getUserByUsername(String username);

    /**
     * 验证登录(以多个的字面量类型作为参数)
     * @param username
     * @param password
     * @return
     */
    User checkLogin(String username,String password);

    /**
     * 验证登录(以map集合作为参数)
     * @param map
     * @return
     */
    User checkLoginByMap(Map<String,Object> map);

    /**
     * 添加用户信息(以实体类类型作为参数) ---> 重要重要重要！！！(记这个和下面那个方式就行)
     * @param user
     */
    void insertUser(User user);

    /**
     * 验证登录(使用@Param标识参数) ---> 重要重要重要！！！(记这个和下面那个方式就行)
     * @param username
     * @param password
     * @return
     */
    User checkLoginByParam(@Param("username") String username, @Param("password") String password);
}
